1、題目
水管工遊戲是指如下圖中的矩陣中,一共有兩種管道,一個是直的,一個是彎的,所有管道都可以自由旋轉,最終就是要連通入水口可出水口。其中的樹爲障礙物。
2、算法思路
本題使用的是深度優先搜索算法,先標識入水口方向,在每次探索新管道的時候上根據入水口方向進行擴展,然後根據管道的類型來判斷下一個節點的入水口方向。
代碼實現:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,flag,book[51][51];
struct note{
int x,y;
}s[100];
int top=0;
void dfs(int x,int y,int front)
{
int i;
if(x==n&&y==m+1)
{
flag=1;
for(int i=1;i<=top;i++)
{
printf("%d,%d\n",s[i].x,s[i].y);
}
return;
}
if(x<1||x>n||y>m||y<1)
{
return ;
}
if(book[x][y]==1)
return ;
book[x][y]=1;
top++;
s[top].x=x;
s[top].y=y;
if(a[x][y]>=5&&a[x][y]<=6)
{
if(front==1)
{
dfs(x,y+1,1);
}
if(front==2)
{
dfs(x+1,y,2);
}
if(front==3)
{
dfs(x,y-1,3);
}
if(front==4)
{
dfs(x-1,y,4);
}
}else if(a[x][y]>=1&&a[x][y]<=4){
if(front==1)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
if(front==2)
{
dfs(x,y+1,1);
dfs(x,y-1,3);
}
if(front==4)
{
dfs(x,y+1,1);
dfs(x,y-1,3);
}
if(front==3)
{
dfs(x+1,y,2);
dfs(x-1,y,4);
}
}
book[x][y]=0;
top--;
return ;
}
int main(){
int num=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
dfs(1,1,1);
if(flag==0)
cout<<"沒有";
return 0;
}